In [1]:
from __future__ import division
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from scipy import stats
from statsmodels.stats.weightstats import CompareMeans, DescrStatsW
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
Уровень кальция в крови здоровых молодых женщин равен в среднем 9.5 милиграммам на децилитр и имеет характерное стандартное отклонение 0.4 мг/дл. В сельской больнице Гватемалы для 160 здоровых беременных женщин при первом обращении для ведения беременности был измерен уровень кальция; среднее значение составило 9.57 мг/дл. Можно ли утверждать, что средний уровень кальция в этой популяции отличается от 9.5?
Посчитайте достигаемый уровень значимости. Поскольку известны только среднее и дисперсия, а не сама выборка, нельзя использовать стандартные функции критериев — нужно реализовать формулу достигаемого уровня значимости самостоятельно.
Округлите ответ до четырёх знаков после десятичной точки.
In [2]:
exp_calc = 9.5
st_dev_calc = 0.4
In [3]:
num = 160
mean_calc = 9.57
In [4]:
def z_test(mean_val, exp_val, st_dev, num):
standard_error = st_dev / np.sqrt(num)
return (mean_val - exp_val) / standard_error
In [5]:
z_stat_calc = z_test(mean_calc, exp_calc, st_dev_calc, num)
z_stat_calc
Out[5]:
In [6]:
def p_val_double(z_stat):
return 2 * (1 - stats.norm.cdf(z_stat))
In [7]:
print('p-value: %.4f' % p_val_double(z_stat_calc))
Имеются данные о стоимости и размерах 53940 бриллиантов:
diamonds.txt
Отделите 25% случайных наблюдений в тестовую выборку с помощью функции sklearn.cross_validation.train_test_split (зафиксируйте random state = 1). На обучающей выборке настройте две регрессионные модели:
линейную регрессию с помощью LinearRegression без параметров случайный лес с помощью RandomForestRegressor с random_state=1. Какая из моделей лучше предсказывает цену бриллиантов? Сделайте предсказания на тестовой выборке, посчитайте модули отклонений предсказаний от истинных цен. Проверьте гипотезу об одинаковом среднем качестве предсказаний, вычислите достигаемый уровень значимости. Отвергается ли гипотеза об одинаковом качестве моделей против двусторонней альтернативы на уровне значимости α=0.05?
In [8]:
diamonds = pd.read_table('diamonds.txt')
diamonds.describe()
diamonds.head()
diamonds.info()
Out[8]:
Out[8]:
In [9]:
diamonds.columns
Out[9]:
In [10]:
X_diam = diamonds.drop(['price'], axis=1)
X_diam.shape
y_diam = diamonds.loc[:, diamonds.columns == 'price']
np.ravel(y_diam).shape
Out[10]:
Out[10]:
In [11]:
X_diam_train, X_diam_test, y_diam_train, y_diam_test = train_test_split(X_diam, y_diam, random_state=1)
In [12]:
clf_lr = LinearRegression()
clf_lr.fit(X_diam_train, y_diam_train)
Out[12]:
In [13]:
pred_price_lr = clf_lr.predict(X_diam_test)
In [14]:
pred_price_lr_sub = pred_price_lr - y_diam_test
pred_price_lr_sub.describe()
Out[14]:
In [15]:
clf_rf = RandomForestRegressor(random_state=1)
clf_rf.fit(X_diam_train, y_diam_train.values.ravel())
Out[15]:
In [16]:
pred_price_rf = clf_rf.predict(X_diam_test)
In [17]:
pred_price_rf_sub = pred_price_rf[:, np.newaxis] - y_diam_test
pred_price_rf_sub.describe()
Out[17]:
In [21]:
stats.ttest_rel(np.abs(pred_price_lr_sub), np.abs(pred_price_rf_sub))
Out[21]:
In [25]:
print "95%% confidence interval: [%f, %f]" % DescrStatsW(np.abs(pred_price_lr_sub) - np.abs(pred_price_rf_sub)).tconfint_mean()